package delete

import (
	"context"
	"fmt"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
)

//  删除字段
func Unset(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$unset": bson.M{"object.id1": "", "date1": ""}}
	mongo.Collection("test").UpdateOne(ctx, bson.M{}, filter)
}

// pop关键字用于删除数组的头或者尾元素
func Pop(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$pop": bson.M{"intlist": 1}} // 1表示删除最后一个元素，-1表示删除第一个元素
	_, err := mongo.Collection("test").UpdateOne(ctx, bson.M{}, filter)
	fmt.Println(err)
}

// pull 是删除数组中匹配条件的元素，下面是最简单的一个场景
func Pull1(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$pull": bson.M{"intlist": 2}} // 删除等于2的元素
	_, err := mongo.Collection("test").UpdateOne(ctx, bson.M{}, filter)
	fmt.Println(err)
}

// 下面是匹配多个元素
func Pull2(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$pull": bson.M{"intlist": bson.M{"$in": bson.A{6, 7}}}} // 删除等于6或7的元素
	_, err := mongo.Collection("test").UpdateOne(ctx, bson.M{}, filter)
	fmt.Println(err)
}

// 下面是删除大于等于5的元素
func Pull3(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$pull": bson.M{"intlist": bson.M{"$gte": 5}}}
	_, err := mongo.Collection("test").UpdateOne(ctx, bson.M{}, filter)
	fmt.Println(err)
}

// 对于数组元素是结构体的，也可以通过下面的方式去匹配删除
func Pull4(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$pullAll": bson.M{"array": bson.M{"text": "你好"}}}
	_, err := mongo.Collection("test").UpdateOne(ctx, bson.M{"_id": 3}, filter)
	fmt.Println(err)
}

// 根据条件删除文档
func DeleteDocuments(mongo *mongo.Database, ctx context.Context) {
	// 根据条件匹配文档
	// filter := bson.M{"_id": 1}
	filter := bson.M{"array": bson.M{"$size": 2}}
	// 删除匹配文档的第一个
	_, err := mongo.Collection("test").DeleteOne(ctx, filter)
	fmt.Println(err)
	// FindOneAndDelete 如果没有找到匹配的文档，会报错，而DeleteOne不会，他两所用的实现方法不一样。
	// temp := mongo.Collection("test").FindOneAndDelete(ctx, filter)
	// fmt.Println(temp.Err())
}
